package com.catazy.mvvmlib.base.fragment

import android.content.Context
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.ViewModelProvider
import com.catazy.mvvmlib.base.viewmodel.BaseViewModel
import com.catazy.mvvmlib.net.network.NetState
import com.catazy.mvvmlib.net.network.NetworkStateManager
import java.lang.reflect.ParameterizedType

/**
 * 作者: Tao
 * 日期: 2024/1/25
 * 时间: 10:41
 * 描述: ViewModel基类Fragment
 */
abstract class BaseVmFragment<VM : BaseViewModel> : Fragment() {

    companion object{
        // 懒加载时间，默认300ms
        const val LAZY_LOAD_TIME = 300L
    }

    lateinit var mViewModel: VM
    lateinit var mActivity: AppCompatActivity

    //是否第一次加载
    private var isFirst: Boolean = true
    private val handler = Handler(Looper.getMainLooper())

    /**
     * 子类实现，传入布局的ID
     */
    abstract fun layoutId(): Int

    /**
     * 子类实现，初始化View
     */
    abstract fun initView(savedInstanceState: Bundle?)

    /**
     * 子类实现，LiveData观察者，规范会代码，所有的LiveData观察者都放在这方法里调用
     */
    open fun initObserver() {}

    /**
     * 子类实现，初始化数据
     */
    open fun initData() {}

    /**
     * 子类实现，懒加载数据，防止 切换动画还没执行完毕时数据就已经加载好了，这时页面会有渲染卡顿
     */
    open fun lazyLoadData() {}

    /**
     * 子类实现，网路状态变化监听
     */
    open fun onNetworkStateChanged(netState: NetState) {}

    /**
     * 子类实现，显示弹窗
     */
    open fun showLoading(message: String = "请求中...") {}

    /**
     * 子类实现，关闭弹窗
     */
    open fun dismissLoading() {}

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(layoutId(), container, false)
    }

    override fun onAttach(context: Context) {
        super.onAttach(context)
        mActivity = context as AppCompatActivity
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        // 创建ViewModel
        initViewModel()
        // 初始化View
        initView(savedInstanceState)
        // 初始化观察者
        initObserver()
        // 初始化数据
        initData()
    }

    override fun onResume() {
        super.onResume()
        onVisible()
    }

    private fun onVisible() {
        if (lifecycle.currentState == Lifecycle.State.STARTED && isFirst) {
            // 延迟加载 防止 切换动画还没执行完毕时数据就已经加载好了，这时页面会有渲染卡顿
            handler.postDelayed({
                lazyLoadData()
                //在Fragment中，懒加载过了才开启网络变化监听
                NetworkStateManager.instance.mNetworkStateCallback.observe(this) {
                    //不是首次订阅时调用方法，防止数据第一次监听错误
                    if (!isFirst){
                        onNetworkStateChanged(it)
                    }
                }
                isFirst = false
            }, LAZY_LOAD_TIME)
        }
    }

    @Suppress("UNCHECKED_CAST")
    private fun initViewModel() {
        // actualTypeArguments[0], 相当于取BaseVmActivity<VM : BaseViewModel>的泛型第一个参数VM : BaseViewModel，
        val type = javaClass.genericSuperclass as ParameterizedType
        val argument = type.actualTypeArguments[0]
        mViewModel = ViewModelProvider(this)[argument as Class<VM>]
    }
}